package day12;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author: 王丹
 * @create: 2021-07-03 16:33
 * 下面代码中add()方法中，当一个线程进入的时候，会执行2次获取锁的操作，运行程序可以正常结束，
 * 并输出和期望值一样的30000，假如ReentrantLock是不可重入的锁，那么同一个线程第2次获取锁的时候
 * 由于前面的锁还未释放而导致死锁，程序是无法正常结束的。ReentrantLock命名也挺好的
 * Re entrant Lock，和其名字一样，可重入锁。
 **/
public class Demo4 {
    private static int num = 0;

    public static ReentrantLock reentrantLock = new ReentrantLock();

    public static void add() {
        reentrantLock.lock();
        reentrantLock.lock();
        try {
            num++;
        } finally {
            reentrantLock.unlock();
            reentrantLock.unlock();
        }
    }

    public static class T extends Thread {
        public void run() {
            for (int i = 0; i < 1000; i++) {
                add();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        T t1 = new T();
        T t2 = new T();
        T t3 = new T();

        t1.start();
        t2.start();
        t3.start();

        t1.join();
        t2.join();
        t3.join();

        System.out.println(num);
    }
}
